home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
MiniExamples
/
AppKit
/
TextORama
/
TextORama.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
4KB
|
196 lines
/* TextORama.m
*
* TextORama is a subclass of Object which acts as the
* application delegate.
*
*
* You may freely copy, distribute, and reuse the code in this example.
* NeXT disclaims any warranty of any kind, expressed or implied, as to its
* fitness for any particular use.
*
* Written by: Sharon Zakhour
* Created: Oct/91
*/
#import "TextORama.h"
#import "TurboTextField.h"
#import "TurboTFCell.h"
@implementation TextORama
- appDidInit:sender
{
id font;
font = [Font newFont: "Helvetica" size: 16.0];
[dateField setAutoJump:YES forLength:8];
[dateField setCustomFilter: (NXTextFilterFunc)dateFilter];
[[dateField cell] setFont: font];
[socSecField setAutoJump:YES forLength:11];
[socSecField setCustomFilter: (NXTextFilterFunc)socSecFilter];
[[socSecField cell] setFont: font];
[phoneField setMaxLength:8];
[phoneField setCustomFilter: (NXTextFilterFunc)phoneFilter];
[[phoneField cell] setFont: font];
[self loadEmacsScrollView];
return self;
}
#define IS_DATE_DELIMITER(ch) ((ch) == '/')
#define IS_PHONE_DELIMITER(ch) ((ch) == '-')
#define IS_NUMBER(ch) ((ch) >= '0' && (ch) <= '9')
#define IS_LETTER(ch) ((ch) >= 'a' && (ch) <= 'z' || (ch) >= 'A' && (ch) <= 'Z')
// This could easily be extended to include letters with diacritics.
// See Chapter 6 Summary for KeyInfo for a full listing of keyboard
// event information.
#define IS_VALID_ASCII(ch) ((ch) >= ' ' && (ch) <= '~')
char *dateFilter(id textObj, char *inputText, int *inputLength, int position)
{
BOOL ok = NO;
char *dateString;
int dateLength, tmp;
switch(position)
{
case 2: case 5:
ok = IS_DATE_DELIMITER(*inputText);
if (!ok && IS_VALID_ASCII(*inputText)) NXBeep();
break;
default:
ok = IS_NUMBER(*inputText);
if (!ok && IS_VALID_ASCII(*inputText)) NXBeep();
break;
}
// Let's do some actual date validation...
dateLength = [textObj textLength];
dateString = malloc(dateLength + 1);
[textObj getSubstring:dateString start:0 length:dateLength];
if (!ok)
{
*inputLength = 0;
free(dateString);
return "";
}
switch (dateLength)
{
case 1:
dateString[1] = '\0';
tmp = atoi(&dateString[0]);
ok = (tmp == 0 || tmp == 1);
break;
case 2:
dateString[2] = '\0';
tmp = atoi(&dateString[0]);
ok = (tmp >= 1 && tmp <= 12);
break;
case 4:
dateString[4] = '\0';
tmp = atoi(&dateString[3]);
ok = (tmp >= 0 && tmp <= 3);
break;
case 5:
dateString[5] = '\0';
tmp = atoi(&dateString[3]);
ok = (tmp >= 1 && tmp <= 31);
break;
case 7:
dateString[7] = '\0';
tmp = atoi(&dateString[6]);
ok = (tmp == 8 || tmp == 9);
break;
case 8:
dateString[8] = '\0';
tmp = atoi(&dateString[6]);
ok = (tmp >= 80 && tmp <= 99);
break;
}
free(dateString);
if (ok) return inputText;
*inputLength = 0;
return "";
}
char *socSecFilter(id textObj, char *inputText, int *inputLength, int position)
{
BOOL ok = NO;
switch(position)
{
case 3: case 6:
ok = IS_PHONE_DELIMITER(*inputText);
if (!ok && IS_VALID_ASCII(*inputText)) NXBeep();
break;
default:
ok = IS_NUMBER(*inputText);
if (!ok && IS_VALID_ASCII(*inputText)) NXBeep();
break;
}
if (ok) return inputText;
*inputLength = 0;
return "";
}
char *phoneFilter(id textObj, char *inputText, int *inputLength, int position)
{
BOOL ok = NO;
switch(position)
{
case 3:
ok = IS_PHONE_DELIMITER(*inputText);
if (!ok && IS_VALID_ASCII(*inputText)) NXBeep();
break;
default:
ok = IS_NUMBER(*inputText);
if (!ok && IS_VALID_ASCII(*inputText)) NXBeep();
break;
}
if (ok) return inputText;
*inputLength = 0;
return "";
}
// Load the EMACS window with some text so that we can play with the emacs
// bindings!!
- loadEmacsScrollView
{
id theTO;
NXStream *s = (NXStream *)nil;
char buf[256];
const char *bp;
theTO = [emacsScrollView docView];
// Open a memory stream on the data file and read it into the text object.
bp = [[NXBundle mainBundle] directory];
sprintf(buf, "%s/SoapStory.rtf", bp);
s = NXMapFile(buf, NX_READONLY);
if (s)
{
[theTO readRichText:s];
NXCloseMemory(s, NX_FREEBUFFER);
}
[[emacsScrollView window] orderFront:nil];
return self;
}
@end